﻿using ConfExpert.Forms.Aksesuar.Satinalma;
using ConfExpert.Forms.Base;
using DevExpress.XtraEditors;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraReports.UI;
using DevTeam;
using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

namespace ConfExpert.Forms.Depo.Aksesuar
{
    public partial class AksesuarPlanlama : XForm
    {
        public int CustomerId { get; set; }
        public int BrandId { get; set; }
        public int SezonId { get; set; }
        public string OrderRef { get; set; }

        public DataTable DtOrderRef { get; set; }

        public AksesuarPlanlama()
        {
            InitializeComponent();
        }

        public AksesuarPlanlama(int CustomerId)
            : this()
        {
            this.CustomerId = CustomerId;
        }

        private void AksesuarIhtiyaci_Load(object sender, EventArgs e)
        {         
            DtOrderRef = ExecuteDataTable("GetOrderRefByCustomer", CustomerId);
            gleOrderRef.Edit.Assign(GetCustomGLE(DtOrderRef, "OrderRef", "AyrimId"));

            gvTreeLines.Init("CreateAksesuarTalepByAyrimId", gleOrderRef.EditValue);
                        
            bool Isnumune = false;
            //TODO K.A : Bekir Bey numunelerde de satınalma geçilsin istiyor. Eğer ilerde satınalma geçilmesin istenirse burayı tekrar aç.
            //Isnumune = gvTreeLines.Dataset().Tables[2].Rows.Count == 0;
            if(Isnumune)
                gvTreeLines.AddColumn("EksikMiktar", typeof(int), "IIF(ToplamIhtiyac-Isnull(AyrilanMiktar,0)-Isnull(QtyPO,0)-Isnull(MusteridenGelecek,0)-Isnull(ToplamCikilan2,0) > 0 and Isnull(OrtakMi,0) = 0, ToplamIhtiyac-Isnull(AyrilanMiktar,0)-Isnull(QtyPO,0)-Isnull(MusteridenGelecek,0)-Isnull(ToplamCikilan,0),0)");
            else
                gvTreeLines.AddColumn("EksikMiktar", typeof(int), "IIF(ToplamIhtiyac-Isnull(AyrilanMiktar,0)-Isnull(QtyPO,0)-Isnull(MusteridenGelecek,0)-Isnull(ToplamCikilan2,0) > 0, ToplamIhtiyac-Isnull(AyrilanMiktar,0)-Isnull(QtyPO,0)-Isnull(MusteridenGelecek,0)-Isnull(ToplamCikilan2,0),0)");

            gvTreeLines.MakeColumnInvisible("MusteridenGelecek", "OrtakMi", "ToplamCikilan2");
            gvTreeLines.MakeReadOnly("MusteridenGelecek");
            gvTreeLines.YanYanaGetir("EksikMiktar:AyrilanMiktar");

            foreach (DevExpress.XtraGrid.Columns.GridColumn gc in gvTreeLines.Columns)
            {
                gvTreeLines.SetCaptions(gc.FieldName + ":" + gc.FieldName.Replace("Miktar", ""));
            }
                
            gvTreeLines.FormatAsNumber(0, "ToplamIhtiyac", "AyrilanMiktar", "IdleMiktar", "QtyPO", "ToplamCikilan", "MusteridenGelecek", "EksikMiktar", "ToplamStok"/*, "DigerMarkaStok"*/);
            gvTreeLines.AddSummary("ToplamIhtiyac", "AyrilanMiktar", "IdleMiktar", "QtyPO", "ToplamCikilan", "MusteridenGelecek", "EksikMiktar", "ToplamStok"/*, "DigerMarkaStok"*/);

            GridManager gm = GridManager.GetManager(gvTreeLines);
            gm.GridMenu.AddMenu("Stok Hareketleri",gvTreeLines_DoubleClick);

            gleOrderRef.EditValueChanged += gleOrderRef_EditValueChanged;
            bbiRezerve.ItemClick += bbiRezerve_ItemClick;
            bbiAksPO.ItemClick += bbiAksPO_ItemClick;
            gvTreeLines.RowCellStyle += gvTreeLines_RowCellStyle;
            gvTreeLines.DoubleClick += gvTreeLines_DoubleClick;

            SetButtonsEnabled();
        }

        void gvTreeLines_DoubleClick(object sender, EventArgs e)
        {
            int handle = gvTreeLines.FocusedRowHandle;

            if (handle > -1)
            {
                int AksesuarId = intParse(gvTreeLines.GetRowCellValue(handle, "AksesuarId"));
                using (AksesuarHareketGC ah = new AksesuarHareketGC(AksesuarId, null, null))
                    ah.ShowDialog();
            }
        }

        void gleOrderRef_EditValueChanged(object sender, EventArgs e)
        {
            int AyrimId = gleOrderRef.EditValue.ToInt();
            if (AyrimId > 0)
            {
                DataRow drAyrim = DtOrderRef.Select("AyrimId = " + AyrimId.ToString())[0];
                BrandId = drAyrim["BrandId"].ToInt();
                SezonId = drAyrim["SezonId"].ToInt();
                OrderRef = drAyrim["OrderRef"].ToString();
            }

            bbiRefresh.PerformClick();
        }

        private bool CheckBOM()
        {
            int AyrimId = gleOrderRef.EditValue.ToInt();
            DataSet dsError = Session.DataManager.ExecuteDataSet("KontrolAksesuarPlanlama", AyrimId);
            int CountModel = dsError.Tables["Table"].Rows.Count;
            if (CountModel > 0)
            {
                string Error = CountModel == 1 ? "Aşağıdaki modele ürün ağacı tanımlayın \n\n" : "Aşağıdaki modellere ürün ağacı tanımlayın \n\n";
                foreach (DataRow drModel in dsError.Tables["Table"].Rows)
                {
                    Error += drModel["Model"].ToStr() + " \n";
                }

                Error = Error.RemoveIfEndsWith("\n");
                ShowErrorMessage(Error);
                return false;
            }

            if (dsError.Tables["Table1"].Select("Error is not null").Length > 0)
            {
                string Error = "";
                foreach (DataRow drModel in dsError.Tables["Table1"].Select("Error is not null"))
                {
                    Error += drModel["Error"].ToStr() + " \n";
                }

                Error = Error.RemoveIfEndsWith("\n");
                if (XtraMessageBox.Show(Error + "Yine de aksesuar ihtiyacını çıkarmak ister misiniz ?", "Critical", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No)
                    return false;
            }

            if (dsError.Tables["Table5"].Rows.Count > 0)
            {
                string Error = "";
                foreach (DataRow drModel in dsError.Tables["Table5"].Rows)
                {
                    Error += drModel["Error"].ToStr() + " \n";
                }

                Error = Error.RemoveIfEndsWith("\n");
                ShowErrorMessage(Error);
                return false;
            }

            if (dsError.Tables["Table2"].Rows.Count > 0)
            {
                string Error = "";
                foreach (DataRow drModel in dsError.Tables["Table2"].Rows)
                {
                    Error += drModel["Error"].ToStr() + " \n";
                }

                Error = Error.RemoveIfEndsWith("\n");
                ShowErrorMessage(Error);
                return false;
            }

            if (dsError.Tables["Table3"].Rows.Count > 0)
            {
                string Error = "";
                foreach (DataRow drModel in dsError.Tables["Table3"].Rows)
                {
                    Error += drModel["Style"] + " modelinin aksesuar serisinde  " + drModel["Beden"].ToStr() + " beden(ler)i için aksesuar tanıtılmamış  \n";
                }

                if (XtraMessageBox.Show(Error + "Yine de aksesuar ihtiyacını çıkarmak ister misiniz ?", "Critical", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No)
                    return false;
            }

            if (dsError.Tables["Table4"].Rows.Count > 0)
            {
                string MukerrerAksesuar = "Dikkat : Aşağıdaki aksesuarlar hem ürün ağacında hem de renkle değişen aksesuarlarda tanımlanmış ! \n\n";
                foreach (DataRow drModel in dsError.Tables["Table4"].Rows)
                {
                    MukerrerAksesuar += "Model : " + drModel["Model"] + " - Stok Kod :" + drModel["StokKod"].ToStr() + " \n";
                }

                if (XtraMessageBox.Show(MukerrerAksesuar + "\nYine de aksesuar ihtiyacını çıkarmak ister misiniz ?", "Critical", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.No)
                    return false;
            }

            return true;
        }

        void bbiRezerve_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            DataTable dtAksesuar = gvTreeLines.DataTable();
            DataRow[] dr = dtAksesuar.Select("Isnull(IdleMiktar,0) > 0 and Isnull(EksikMiktar,0) > 0 and Isnull(OrtakMi,0) = 0");

            if (dr.Length > 0)
            {
                DataTable dt = dr.CopyToDataTable();
                dt.TableName = "Aksesuar";
                dt.Columns.Add("QtySelected", typeof(int), "IIF( IsNull(IdleMiktar, 0) < IsNull(EksikMiktar, 0), IsNull(IdleMiktar, 0), IsNull(EksikMiktar, 0))");

                string xmlSel = dt.Serialize();

                using (AksesuarAyir transfer = new AksesuarAyir(xmlSel, BrandId, SezonId, OrderRef))
                    if (transfer.ShowDialog() == DialogResult.OK)
                    {
                        bbiRefresh.PerformClick();
                    }
            }
        }

        void bbiAksPO_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            gvTreeLines.EndEditing();
            DataTable dtAksesuar = gvTreeLines.DataTable();
            DataRow[] drIdle = dtAksesuar.Select("Isnull(IdleMiktar,0) > 0 and Isnull(EksikMiktar,0) > 0 and Isnull(OrtakMi,0) = 0");

            if (drIdle.Length > 0)
            {
                if (XtraMessageBox.Show("Bu siparişe ayırabileceğiniz IDLE stok var. İlk önce IDLE stoğu siparişe ayırmak ister misiniz ?", "Critical", MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
                    bbiRezerve.PerformClick();
            }

            DataRow[] dr = dtAksesuar.Select("Isnull(EksikMiktar,0) > 0");

            if (dr.Length > 0)
            {
                DataTable dt = dr.CopyToDataTable();
                dt.Columns.Add("TalepEdilen", typeof(int), "EksikMiktar");
                
                using (Talep ast = new Talep(dt, BrandId, SezonId, OrderRef))
                    if (ast.ShowDialog() == DialogResult.OK)
                    {
                        string AksPOId = ast.POIds.ToString();
                        Rapor.Aksesuar.xrAksesuarSiparisFoy asf = new Rapor.Aksesuar.xrAksesuarSiparisFoy(AksPOId, "GetAksesuarSiparisFoyu", "AksPOId");
                        asf.ShowPreview();
                        bbiRefresh.PerformClick();
                    }
            }
        }

        private void SetButtonsEnabled()
        {
            DataTable dtAksesuar = gvTreeLines.DataTable();

            int RzvRowCount = dtAksesuar.Select("Isnull(IdleMiktar,0) > 0 and Isnull(EksikMiktar,0) > 0  and Isnull(OrtakMi,0) = 0").Length;
            int EksikRowCount = dtAksesuar.Select("Isnull(EksikMiktar,0) > 0").Length;

            bbiAksPO.Enabled = EksikRowCount > 0;
            bbiRezerve.Enabled = RzvRowCount > 0;
        }

        void gvTreeLines_RowCellStyle(object sender, RowCellStyleEventArgs e)
        {
            GridView view = sender as GridView;
            if (e.RowHandle > -1)
            {
                int TalepEdilen = view.GetRowCellValue(e.RowHandle, "ToplamIhtiyac").ToInt();
                int EksikMiktar = view.GetRowCellValue(e.RowHandle, "EksikMiktar").ToInt();

                if (e.Column.FieldName == "ToplamIhtiyac")
                {
                    int AyrilanMiktar = view.GetRowCellValue(e.RowHandle, "AyrilanMiktar").ToInt();
                    int ToplamCikilan = view.GetRowCellValue(e.RowHandle, "ToplamCikilan").ToInt();

                    int IdleMiktar = view.GetRowCellValue(e.RowHandle, "IdleMiktar").ToInt();

                    int BrandId = view.GetRowCellValue(e.RowHandle, "BrandId").ToInt();

                    //if ((AyrilanMiktar + ToplamCikilan < TalepEdilen * 0.95 && BrandId != 1) || (IdleMiktar < TalepEdilen * 0.95 && BrandId == 1))
                    if ((AyrilanMiktar + ToplamCikilan < TalepEdilen && BrandId != 1) || (IdleMiktar < TalepEdilen && BrandId == 1))
                        e.Appearance.BackColor = Color.Pink;
                    e.Appearance.Font = new Font(DevExpress.Utils.AppearanceObject.DefaultFont, FontStyle.Bold);
                }

                if (e.Column.FieldName == "EksikMiktar")
                {
                    e.Appearance.Font = new Font(DevExpress.Utils.AppearanceObject.DefaultFont, FontStyle.Bold);
                    e.Appearance.ForeColor = EksikMiktar > TalepEdilen * 0.05 ? Color.Red : Color.Green;
                }

            }
        }

        private void bbiRefresh_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            if (CheckBOM())
            {
                gvTreeLines.RefreshDataSource(true, "CreateAksesuarTalepByAyrimId", gleOrderRef.EditValue);

                //bool Isnumune = false;
                //TODO K.A : Bekir Bey numunelerde de satınalma geçilsin istiyor. Eğer ilerde satınalma geçilmesin istenirse burayı tekrar aç.
                //Isnumune = gvTreeLines.Dataset().Tables[2].Rows.Count == 0;
                //if (Isnumune)
                //    gvTreeLines.ChangeExpression("EksikMiktar", "IIF(ToplamIhtiyac-Isnull(AyrilanMiktar,0)-Isnull(QtyPO,0)-Isnull(MusteridenGelecek,0)-Isnull(ToplamCikilan,0) > 0 and Isnull(OrtakMi,0) = 0, ToplamIhtiyac-Isnull(AyrilanMiktar,0)-Isnull(QtyPO,0)-Isnull(MusteridenGelecek,0)-Isnull(ToplamCikilan,0),0)");
                //else
                //    gvTreeLines.ChangeExpression("EksikMiktar", "IIF(ToplamIhtiyac-Isnull(AyrilanMiktar,0)-Isnull(QtyPO,0)-Isnull(MusteridenGelecek,0)-Isnull(ToplamCikilan,0) > 0, ToplamIhtiyac-Isnull(AyrilanMiktar,0)-Isnull(QtyPO,0)-Isnull(MusteridenGelecek,0)-Isnull(ToplamCikilan,0),0)");
            

                gvTreeLines.BestFitColumns();
                SetButtonsEnabled();
                UpdAksesuarPlanlama();
            }
        }

        private void bbiSave_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            gvTreeLines.EndEditing();
            DataRow[] drMusteri = gvTreeLines.DataTable().Select("Isnull(MusteridenGelecek,0) > 0");
            if (drMusteri.Length > 0)
            {
                DataTable dtMusteri = drMusteri.CopyToDataTable();
                string xml = dtMusteri.Serialize();
                ExecuteNonQuery("InsMusteridenGelecekAksesuar", xml, gleOrderRef.EditValue, WhoAmI);
                bbiRefresh.PerformClick();
            }
        }

        void UpdAksesuarPlanlama()
        {
            //bool IsSiparisPlanExist = gvTreeLines.Dataset().Tables[1].Rows.Count > 0;
            //bool SiparisPlan;
            //if (IsSiparisPlanExist)
            //    SiparisPlan = Boolean.Parse(gvTreeLines.Dataset().Tables[1].Rows[0]["PlanlandiMi"].ToStr());
            //else
            //    SiparisPlan = false;

            DataTable dt = gvTreeLines.DataTable();
            bool PlanlandiMi = dt.Select("Isnull(EksikMiktar,0) > ToplamIhtiyac * 0.05 and Isnull(EksikMiktar,0) > 2").Length == 0;

            //if (PlanlandiMi)
                ExecuteNonQuery("UpdAksesuarPlanlama", gleOrderRef.EditValue, PlanlandiMi, WhoAmI);
        }
    }
}